﻿using System;
using Anagramme.Contracts;
namespace Anagramme.Model
{
    /// <summary>
    /// Contract pour un modèle de lobby
    /// </summary>
    public interface ILobbyModel : ILobbyService, IService
    {
        /// <summary>
        /// Se produit lors du changement de mode de jeu
        /// </summary>
        event EventHandler<EventArgs<Anagramme.Contracts.GameModes>> OnResponseLobbyChangeGameMode;

        /// <summary>
        /// Se produit lors du changement de la longueur maximale des mots
        /// </summary>
        event EventHandler<EventArgs<int>> OnResponseLobbyChangeMaxWordsLength;

        /// <summary>
        /// Se produit lors du changement de la longueur minimale des mots
        /// </summary>
        event EventHandler<EventArgs<int>> OnResponseLobbyChangeMinWordsLength;

        /// <summary>
        /// Se produit lors du changement du nombre de rounds cible
        /// </summary>
        event EventHandler<EventArgs<int>> OnResponseLobbyChangeTargetRounds;

        /// <summary>
        /// Se produit lors du changement du score cible
        /// </summary>
        event EventHandler<EventArgs<int>> OnResponseLobbyChangeTargetScore;

        /// <summary>
        /// Se produit lorsque le serveur est arrêté
        /// </summary>
        event EventHandler OnResponseLobbyDisconnect;

        /// <summary>
        /// Se produit lors de la récupération des informations sur le lobby
        /// </summary>
        event EventHandler<EventArgs<Anagramme.Contracts.LobbyInfo>> OnResponseLobbyInfos;

        /// <summary>
        /// Se produit lors de la connexion au lobby
        /// </summary>
        event EventHandler<EventArgs<Guid>> OnResponseLobbyJoin;

        /// <summary>
        /// Se produit lors de la notification du serveur du chargement de la partie
        /// </summary>
        event EventHandler OnResponseLobbyLoadGame;

        /// <summary>
        /// Se produit lors du changement du statut "Prêt" d'un joueur
        /// </summary>
        event EventHandler<EventArgs<int, bool>> OnResponseLobbyPlayerIsReadyToPlay;

        /// <summary>
        /// Se produit lors de la récupération des informations sur le joueur courrant
        /// </summary>
        event EventHandler<EventArgs<Player>> OnResponseLobbyPlayerInfo;

        /// <summary>
        /// Se produit lorsqu'un joueur rejoint le lobby
        /// </summary>
        event EventHandler<EventArgs<Anagramme.Contracts.Player>> OnResponseLobbyPlayerJoin;

        /// <summary>
        /// Se produit lorsqu'un joueur quitte le lobby
        /// </summary>
        event EventHandler<EventArgs<int>> OnResponseLobbyPlayerLeave;

        /// <summary>
        /// Se produit lors de la récupération de la liste des joueurs du lobby
        /// </summary>
        event EventHandler<EventArgs<System.Collections.Generic.IEnumerable<Player>>> OnResponseLobbyPlayers;
    }
}
